/*
 * Desenhadora.cpp
 * Created on: 29/09/2011
 * Author: Catharine
 */

#include "view/Desenhadora.h"
#include <FMedia.h>

using namespace Osp::Media;
using namespace Osp::Graphics;

Desenhadora::Desenhadora() {
}

void Desenhadora::DesenhaCartaVirada(int x, int y, Canvas *pCanvas)
{
	pCanvas->DrawBitmap(Point(x, y), *bitmapFundoVerso);
}

void Desenhadora::DesenhaBackground(Canvas* pCanvas)
{
	pCanvas->DrawBitmap(Point(0,0), *bitmapBackground);
}

void Desenhadora::DesenhaBackground(Canvas* pCanvas, String imgPath)
{
	Image decoder;
	decoder.Construct();
	Bitmap* img = decoder.DecodeN(imgPath, BITMAP_PIXEL_FORMAT_ARGB8888);
	pCanvas->DrawBitmap(Point(0,0), *img);

	delete img;
}

Desenhadora::~Desenhadora() {
	delete bitmapEspadas;
	delete bitmapPaus;
	delete bitmapOuros;
	delete bitmapCopas;
	delete bitmapFundoNormal;
	delete bitmapFundoBonus;
	listaBitmapsPretos.RemoveAll(true);
	listaBitmapsVermelhos.RemoveAll(true);
}

void Desenhadora::Construct() {

	//locais das pastas
	String PASTA_VERMELHOS = L"/Home/cartas/numeros/vermelhos/";
	String PASTA_PRETOS = L"/Home/cartas/numeros/pretos/";
	String PASTA_FUNDOS = L"/Home/cartas/";
	String PASTA_NAIPES = L"/Home/cartas/naipes/";
	String PASTA_IMAGENS= L"/Home/imagens/";

	//constroi listas
	listaBitmapsPretos.Construct(13);
	listaBitmapsVermelhos.Construct(13);

	//cria decoder
	Image decoder;
	decoder.Construct();

	//constroi bitmaps naipes
	bitmapEspadas = decoder.DecodeN(PASTA_NAIPES + "espadas.png",BITMAP_PIXEL_FORMAT_ARGB8888);
	bitmapPaus = decoder.DecodeN(PASTA_NAIPES + "paus.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	bitmapCopas = decoder.DecodeN(PASTA_NAIPES + "copas.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	bitmapOuros = decoder.DecodeN(PASTA_NAIPES + "ouros.png", BITMAP_PIXEL_FORMAT_ARGB8888);

	//constroi bitmaps fundos
	bitmapFundoNormal = decoder.DecodeN(PASTA_FUNDOS + "fundo-normal.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	bitmapFundoVerso = decoder.DecodeN(PASTA_FUNDOS + "fundo-verso.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	bitmapEscura = decoder.DecodeN(PASTA_FUNDOS + "fade.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	bitmapBackground = decoder.DecodeN("/Home/fundo-horizontal.png", BITMAP_PIXEL_FORMAT_ARGB8888);

	//constroi bitmaps caixas
	bitmapCaixaJogador = decoder.DecodeN(PASTA_IMAGENS + "caixa-jogador.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	bitmapCaixaJogadorAI = decoder.DecodeN(PASTA_IMAGENS + "caixa-jogadorAI.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	bitmapCaixaPot = decoder.DecodeN(PASTA_IMAGENS + "caixa-pot.png", BITMAP_PIXEL_FORMAT_ARGB8888);

	Bitmap* temp;

	//constroi bitmaps pretos
	temp = decoder.DecodeN(PASTA_PRETOS + "a-preto.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	listaBitmapsPretos.Add(*temp);

	String num;
	for (int i = 2; i <= 10; i++) {
		num = Integer::ToString(i);
		temp = decoder.DecodeN(PASTA_PRETOS + num + "-preto.png", BITMAP_PIXEL_FORMAT_ARGB8888);
		listaBitmapsPretos.Add(*temp);
	}

	temp = decoder.DecodeN(PASTA_PRETOS + "j-preto.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	listaBitmapsPretos.Add(*temp);
	temp = decoder.DecodeN(PASTA_PRETOS + "q-preto.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	listaBitmapsPretos.Add(*temp);
	temp = decoder.DecodeN(PASTA_PRETOS + "k-preto.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	listaBitmapsPretos.Add(*temp);

	//constroi bitmaps vermelhos
	temp = decoder.DecodeN(PASTA_VERMELHOS + "a-vermelho.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	listaBitmapsVermelhos.Add(*temp);

	for (int i = 2; i <= 10; i++) {
		num = Integer::ToString(i);
		temp = decoder.DecodeN(PASTA_VERMELHOS + num + "-vermelho.png", BITMAP_PIXEL_FORMAT_ARGB8888);
		listaBitmapsVermelhos.Add(*temp);
	}

	temp = decoder.DecodeN(PASTA_VERMELHOS + "j-vermelho.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	listaBitmapsVermelhos.Add(*temp);
	temp = decoder.DecodeN(PASTA_VERMELHOS + "q-vermelho.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	listaBitmapsVermelhos.Add(*temp);
	temp = decoder.DecodeN(PASTA_VERMELHOS + "k-vermelho.png", BITMAP_PIXEL_FORMAT_ARGB8888);
	listaBitmapsVermelhos.Add(*temp);

}

void Desenhadora::DesenhaCarta(Carta *carta, int x, int y, Canvas *pCanvas, bool escura) {
	if (pCanvas != null) {
		Bitmap* fundo;
		Bitmap* numero;
		Bitmap* naipe;
		bool ehPreta;

		fundo = bitmapFundoNormal;

		switch (carta->naipe) {
		case ESPADAS:
			naipe = bitmapEspadas;
			ehPreta = true;
			break;
		case PAUS:
			naipe = bitmapPaus;
			ehPreta = true;
			break;
		case COPAS:
			naipe = bitmapCopas;
			ehPreta = false;
			break;
		case OUROS:
			naipe = bitmapOuros;
			ehPreta = false;
			break;

		default:
			break;
		}

		if(ehPreta){
			numero = (Bitmap*) listaBitmapsPretos.GetAt(carta->numero);
		}else{
			numero = (Bitmap*) listaBitmapsVermelhos.GetAt(carta->numero);
		}

		pCanvas->DrawBitmap(Point(x, y), *fundo);
		pCanvas->DrawBitmap(Point(x, y), *numero);
		pCanvas->DrawBitmap(Point(x, y), *naipe);
		if(escura){
			pCanvas->DrawBitmap(Point(x, y), *bitmapEscura);
		}
	}
}

void Desenhadora::DesenhaMao(Mao *m, int x, int y, Canvas *pCanvas) {
	int coluna;

	for (int i = 0; i < m->GetQtdCartas(); ++i) {
		coluna = i;

		DesenhaCarta(m->GetCarta(i), x + coluna*46, y, pCanvas);
	}
}

void Desenhadora::DesenhaCaixaJogador(int x, int y, String nome, String jogada, Mao *mao, int dinheiro, Canvas *pCanvas)
{
	String strDin = "Money: $";
	strDin.Append(dinheiro);

	pCanvas->DrawBitmap(Point(x, y), *bitmapCaixaJogador);
	DesenhaMao(mao, x + 4, y + 4, pCanvas);

	//todo - definir as posicoes
	/*
	pCanvas->DrawText(Point(x, y), nome, Color::COLOR_BLACK);
	pCanvas->DrawText(Point(x, y), jogada, Color::COLOR_BLACK);
	pCanvas->DrawText(Point(x, y), strDin, Color::COLOR_BLACK);
	*/
}

void Desenhadora::DesenhaMesa(int x, int y, Mao *m, int pot, Canvas *pCanvas)
{
	DesenhaMao(m ,x, y, pCanvas);

	//todo - definir as posicoes
	String strPot = "Pot:\n$ ";
	strPot.Append(pot);
	//pCanvas->DrawBitmap(Point(x, y), *bitmapCaixaPot);
	//pCanvas->DrawText(Point(x, y), strPot, Color::COLOR_BLACK);
}

void Desenhadora::DesenhaCaixaJogadorAI(int x, int y, String nome, String jogada, Canvas *pCanvas)
{
	pCanvas->DrawBitmap(Point(x, y), *bitmapCaixaJogadorAI);

	//todo - definir as posicoes
	/*
	pCanvas->DrawText(Point(x, y), nome, Color::COLOR_BLACK);
	pCanvas->DrawText(Point(x, y), jogada, Color::COLOR_BLACK);
	*/

}

void Desenhadora::DesenhaVencedor(String nome, Combinacao *combinacao, int cofreJogador, int pot, Mao *maoJogador, Mao *maoMesa, Canvas *pCanvas)
{
}
